package com.kexio.core.security.service;

import com.kexio.core.security.context.UserContext;
import com.kexio.core.security.jwt.JwtTokenProvider.TokenPair;

/**
 * 认证服务接口
 *
 * @author Kexio Team
 * @since 1.0.0
 */
public interface AuthenticationService {

    /**
     * 用户登录认证
     *
     * @param username 用户名
     * @param password 密码
     * @return 令牌对
     */
    TokenPair authenticate(String username, String password);

    /**
     * 用户登录认证(带租户信息)
     *
     * @param username 用户名
     * @param password 密码
     * @param tenantId 租户ID
     * @return 令牌对
     */
    TokenPair authenticate(String username, String password, Long tenantId);

    /**
     * 验证访问令牌
     *
     * @param accessToken 访问令牌
     * @return 用户上下文
     */
    UserContext validateAccessToken(String accessToken);

    /**
     * 验证刷新令牌
     *
     * @param refreshToken 刷新令牌
     * @return 是否有效
     */
    boolean validateRefreshToken(String refreshToken);

    /**
     * 使用刷新令牌获取新的访问令牌
     *
     * @param refreshToken 刷新令牌
     * @return 新的访问令牌
     */
    String refreshAccessToken(String refreshToken);

    /**
     * 用户登出
     *
     * @param accessToken 访问令牌
     * @return 是否成功
     */
    boolean logout(String accessToken);

    /**
     * 检查用户是否已登录
     *
     * @return 是否已登录
     */
    boolean isLoggedIn();

    /**
     * 获取当前登录用户
     *
     * @return 用户上下文
     */
    UserContext getCurrentUser();

    /**
     * 验证用户密码
     *
     * @param username    用户名
     * @param rawPassword 原始密码
     * @return 是否验证成功
     */
    boolean verifyPassword(String username, String rawPassword);

    /**
     * 修改用户密码
     *
     * @param username    用户名
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否修改成功
     */
    boolean changePassword(String username, String oldPassword, String newPassword);

    /**
     * 重置用户密码
     *
     * @param username    用户名
     * @param newPassword 新密码
     * @return 是否重置成功
     */
    boolean resetPassword(String username, String newPassword);
}
